import java.util.*;
import java.util.HashMap;

class Student{

}
//HashMap
public class Test {
    public static void main1(String[] args) {
        HashMap<String, Integer> map = new HashMap<>();
        map.put("张三",1);
        map.put("李四",2);
        map.put(null,null); //HashMap是可以放空值得

        System.out.println(map.get("张三"));

        System.out.println(map);

        Set<Map.Entry<String,Integer>> entries = map.entrySet();
        for (Map.Entry<String,Integer> entry: entries) {
            System.out.println(entry.getKey()+" ->  " +entry.getValue());
        }
        System.out.println(map);

        //HashMap得key值是可以不比较的，并且key值不能相同，如果有存放相同的，那么会覆盖原来key的value
        HashMap<Student,Integer> map2 = new HashMap<>();
        map2.put(new Student(),2);
        map2.put(new Student(),1);
        System.out.println(map2);

        //HashSet底层是HashMap
        HashSet<Integer> set = new HashSet<>();
        set.add(1);
        set.add(1);
        set.add(1);
        System.out.println("size: " + set.size());
    }

    /** 1. 统计10W个数据当中，不重复的数据（去重）
     * @param array
     */
    public static void func1(int[] array) {
        HashSet<Integer> set = new HashSet<>();
        for (int i = 0; i < array.length; i++) {
            set.add(array[i]);
        }
        System.out.println(set);
    }

    /** 2.统计10W个数据当中，第一个重复的数据
     * @param array
     */
    public static void func2(int[] array) {
        HashSet<Integer> set = new HashSet<>();
        for (int i = 0; i < array.length; i++) {
            if(!set.contains(array[i])) {
                set.add(array[i]);
            }else {
                System.out.println(array[i]);
                return;
            }
        }
    }

    /** 3.统计10W个数据当中，每个数据出现的次数
     * @param array
     */
    public static void func3(int[] array) {
        HashMap<Integer,Integer> map = new HashMap<>();
        // 1.遍历原来的数据，统计每个数据出现的次数
        for (int i = 0; i < array.length; i++) {
            int key = array[i];
            if(map.get(key) == null) {
                map.put(key,1); // 第一次存放
            }else {
                int val = map.get(key); // key出现的次数
                map.put(key,val+1);
            }
        }
        for (Map.Entry<Integer,Integer> entry : map.entrySet()) {
            System.out.println("key:" + entry.getKey() +"，出现了："+entry.getValue()+"次！");
        }
    }

    public static void main2(String[] args) {
        int[] array = new int[10_0000];
        Random random = new Random();
        for (int i = 0; i < 10_0000; i++) {
            array[i] = random.nextInt(5_0000);
        }
        func1(array);
        func2(array);
        func3(array);
    }

    public static void main(String[] args) {
        int[] array = {1,1,1,4,5,5,6};
        func3(array);
    }
}
